diff -Naur wolf4sdl-2.0+20210408_f31f41a/id_in.c wolf4sdl-2.0+20210408_f31f41a.patched/id_in.c
--- wolf4sdl-2.0+20210408_f31f41a/id_in.c	2023-01-17 21:39:16.000000000 -0500
+++ wolf4sdl-2.0+20210408_f31f41a.patched/id_in.c	2023-01-18 03:22:12.892051206 -0500
@@ -393,6 +393,12 @@
     return Joystick != NULL;
 }
 
+boolean autorun = false;
+boolean autostrafe = false;
+/* This doesn't work yet.
+boolean mw_dn = false, mw_up = false;
+*/
+
 static void processEvent(SDL_Event *event)
 {
     switch (event->type)
@@ -417,6 +423,34 @@
 
             LastScan = event->key.keysym.sym;
             SDL_Keymod mod = SDL_GetModState();
+
+            if ((mod & KMOD_LSHIFT) && (mod & KMOD_RSHIFT))
+            {
+                autorun = !autorun;
+
+                if (autorun)
+                    Message ("Always Run: On");
+                else
+                    Message ("Always Run: Off");
+
+                IN_ClearKeysDown ();
+                IN_Ack ();
+            }
+            if (((mod & KMOD_LALT) && (mod & KMOD_RALT)) ||
+                ((mod & KMOD_LALT) && (mod & KMOD_MODE)) ||
+                ((mod & KMOD_LALT) && (mod & KMOD_RSHIFT)))
+            {
+                autostrafe = !autostrafe;
+
+                if (autostrafe)
+                    Message ("Always Strafe: On");
+                else
+                    Message ("Always Strafe: Off");
+
+                IN_ClearKeysDown ();
+                IN_Ack ();
+            }
+
             if(Keyboard(sc_Alt))
             {
                 if(LastScan==SDLK_F4)
@@ -426,6 +460,7 @@
             if(LastScan == SDLK_KP_ENTER) LastScan = SDLK_RETURN;
             else if(LastScan == SDLK_RSHIFT) LastScan = SDLK_LSHIFT;
             else if(LastScan == SDLK_RALT) LastScan = SDLK_LALT;
+            else if(LastScan == SDLK_MODE) LastScan = SDLK_LALT; /* AltGr */
             else if(LastScan == SDLK_RCTRL) LastScan = SDLK_LCTRL;
             else
             {
@@ -470,6 +505,7 @@
             if(key == SDLK_KP_ENTER) key = SDLK_RETURN;
             else if(key == SDLK_RSHIFT) key = SDLK_LSHIFT;
             else if(key == SDLK_RALT) key = SDLK_LALT;
+            else if(key == SDLK_MODE) key = SDLK_LALT; /* AltGr */
             else if(key == SDLK_RCTRL) key = SDLK_LCTRL;
             else
             {
@@ -497,6 +533,18 @@
             GP2X_ButtonUp(event->jbutton.button);
             break;
 #endif
+
+				/*
+        case SDL_MOUSEWHEEL:
+        {
+            mw_dn = mw_up = false;
+            if (event->wheel.y < 0)
+                mw_dn = true;
+            else if(event->wheel.y > 0)
+                mw_up = true;
+            break;
+        }
+		  */
     }
 }
 
diff -Naur wolf4sdl-2.0+20210408_f31f41a/wl_def.h wolf4sdl-2.0+20210408_f31f41a.patched/wl_def.h
--- wolf4sdl-2.0+20210408_f31f41a/wl_def.h	2023-01-17 21:39:16.000000000 -0500
+++ wolf4sdl-2.0+20210408_f31f41a.patched/wl_def.h	2023-01-18 03:22:12.893051223 -0500
@@ -949,6 +949,8 @@
 extern  int      param_mission;
 extern  boolean  param_goodtimes;
 extern  boolean  param_ignorenumchunks;
+extern  boolean  param_novert;
+extern  boolean  param_crosshair;
 
 
 void            NewGame (int difficulty, int episode);
diff -Naur wolf4sdl-2.0+20210408_f31f41a/wl_draw.c wolf4sdl-2.0+20210408_f31f41a.patched/wl_draw.c
--- wolf4sdl-2.0+20210408_f31f41a/wl_draw.c	2023-01-17 21:39:16.000000000 -0500
+++ wolf4sdl-2.0+20210408_f31f41a.patched/wl_draw.c	2023-01-18 03:22:12.893051223 -0500
@@ -956,6 +956,17 @@
         SimpleScaleShape(viewwidth/2,SPR_DEMO,viewheight+1);
 }
 
+void DrawCrosshair (void)
+{           
+    if (gamestate.victoryflag || gamestate.weapon < wp_pistol)
+        return;
+
+    const int c = (gamestate.health >= 50) ? 2 : (gamestate.health >= 25) ? 6 : 4;          
+    const int h = (viewsize == 21 && ingame) ? screenHeight : screenHeight - scaleFactor * STATUSLINES;
+
+    VL_Hlin (screenWidth / 2 - scaleFactor, h / 2,               2 * scaleFactor + 1, c);
+    VL_Vlin (screenWidth / 2,               h / 2 - scaleFactor, 2 * scaleFactor + 1, c);
+}
 
 //==========================================================================
 
@@ -1666,6 +1677,8 @@
 #endif
 
     DrawPlayerWeapon ();    // draw player's hands
+    if (param_crosshair)
+        DrawCrosshair ();
 
     if(Keyboard(sc_Tab) && viewsize == 21 && gamestate.weapon != -1)
         ShowActStatus();
diff -Naur wolf4sdl-2.0+20210408_f31f41a/wl_main.c wolf4sdl-2.0+20210408_f31f41a.patched/wl_main.c
--- wolf4sdl-2.0+20210408_f31f41a/wl_main.c	2023-01-17 21:39:16.000000000 -0500
+++ wolf4sdl-2.0+20210408_f31f41a.patched/wl_main.c	2023-01-18 03:40:19.681065262 -0500
@@ -102,6 +102,10 @@
 int     param_mission = 0;
 boolean param_goodtimes = false;
 boolean param_ignorenumchunks = false;
+boolean param_novert = false;
+boolean param_crosshair = false;
+extern boolean autorun;
+extern boolean autostrafe;
 
 /*
 =============================================================================
@@ -1644,6 +1648,28 @@
             fullscreen = false;
             forcegrabmouse = true;
         }
+        else IFARG("--novert")
+        {
+            param_novert = true;
+        }
+        else IFARG("--crosshair")
+        {
+            param_crosshair = true;
+        }
+        else IFARG("--strafe")
+        {
+            autostrafe = true;
+        }
+        else IFARG("--run")
+        {
+            autorun = true;
+        }
+        else IFARG("--modern")
+        {
+            autostrafe = true;
+            param_crosshair = true;
+            param_novert = true;
+        }
         else IFARG("--res")
         {
             if(i + 2 >= argc)
@@ -1824,6 +1850,11 @@
             " --hard                 Sets the difficulty to hard for tedlevel\n"
             " --nowait               Skips intro screens\n"
             " --windowed[-mouse]     Starts the game in a window [and grabs mouse]\n"
+            " --novert               Suppresses vertical mouse movement\n"
+            " --crosshair            Shows a crosshair\n"
+            " --run                  Always run\n"
+            " --strafe               Always strafe\n"
+            " --modern               Same as --novert --crosshair --strafe\n"
             " --res <width> <height> Sets the screen resolution\n"
             "                        (must be multiple of 320x200 or 320x240)\n"
             " --resf <w> <h>         Sets any screen resolution >= 320x200\n"
diff -Naur wolf4sdl-2.0+20210408_f31f41a/wl_play.c wolf4sdl-2.0+20210408_f31f41a.patched/wl_play.c
--- wolf4sdl-2.0+20210408_f31f41a/wl_play.c	2023-01-17 21:39:16.000000000 -0500
+++ wolf4sdl-2.0+20210408_f31f41a.patched/wl_play.c	2023-01-18 03:22:12.894051239 -0500
@@ -260,10 +260,19 @@
 void PollKeyboardButtons (void)
 {
     int i;
+    extern boolean autorun;
 
     for (i = 0; i < NUMBUTTONS; i++)
         if (Keyboard(buttonscan[i]))
             buttonstate[i] = true;
+
+    if (autorun)
+    {
+        if (Keyboard(buttonscan[bt_run]))
+            buttonstate[bt_run] = false;
+        else
+            buttonstate[bt_run] = true;
+    }
 }
 
 
@@ -278,6 +287,9 @@
 void PollMouseButtons (void)
 {
     int buttons = IN_MouseButtons ();
+	 /*
+    extern boolean mw_dn, mw_up;
+	 */
 
     if (buttons & 1)
         buttonstate[buttonmouse[0]] = true;
@@ -285,6 +297,14 @@
         buttonstate[buttonmouse[1]] = true;
     if (buttons & 4)
         buttonstate[buttonmouse[2]] = true;
+
+	 /* This doesn't work, sadly.
+    if (mw_dn)
+        buttonstate[bt_prevweapon] = true;
+    if (mw_up)
+        buttonstate[bt_nextweapon] = true;
+    mw_dn = mw_up = false;
+	 */
 }
 
 
@@ -320,15 +340,26 @@
 void PollKeyboardMove (void)
 {
     int delta = buttonstate[bt_run] ? RUNMOVE * tics : BASEMOVE * tics;
+    extern boolean autostrafe;
 
     if (Keyboard(dirscan[di_north]))
         controly -= delta;
     if (Keyboard(dirscan[di_south]))
         controly += delta;
     if (Keyboard(dirscan[di_west]))
-        controlx -= delta;
+    {
+        if (autostrafe)
+            buttonstate[bt_strafeleft] = true;
+        else
+            controlx -= delta;
+    }
     if (Keyboard(dirscan[di_east]))
-        controlx += delta;
+    {
+        if (autostrafe)
+            buttonstate[bt_straferight] = true;
+        else
+            controlx += delta;
+    }
 }
 
 
@@ -356,7 +387,8 @@
 #endif
 
     controlx += mousexmove * 10 / (13 - mouseadjustment);
-    controly += mouseymove * 20 / (13 - mouseadjustment);
+    if (!param_novert)
+        controly += mouseymove * 20 / (13 - mouseadjustment);
 }
 
 
